# -*- coding: utf-8 -*-
from datetime import datetime

from django.db import models
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
from django.contrib.localflavor.br.br_states import STATE_CHOICES

from fornecedor.negocio import validate_cnpj

def doc_empresa_upload_location(instance, filename):
    return 'doc_empresas/%s/%s' % (instance.usuario.username, filename)

def doc_produtos_upload_location(instance, filename):
    return 'doc_produtos/%s/%s' % (instance.usuario.username, filename)

class Fornecedor(models.Model):
    class Meta:
        verbose_name_plural = 'Fornecedores'
        permissions = (
            ('is_fornecedor', 'É fornecedor'),
            ('can_edit', 'Editar fornecedor.'),
            ('can_homolog','Homologar fornecedor.'),
            ('can_create', 'Adicionar fornecedor.'),
            ('can_view', 'Visualizar informações.'),
            ('can_view_list', 'Visualizar lista de fornecedores.'),
        )

    nome_fantasia = models.CharField(u'Nome Fantasia', max_length=100)
    razao_social = models.CharField(u'Razão Social', max_length=100)
    cnpj = models.DecimalField(u'CNPJ', max_digits=15, decimal_places=0,
                    unique=True, db_index=True, validators=[validate_cnpj])
    logradouro = models.CharField('Logradouro', max_length=50, null=True, blank=True)
    numero = models.IntegerField(u'Nº', max_length=10, null=True, blank=True)
    cep = models.IntegerField(u'CEP', max_length=9, null=True, blank=True)
    cidade = models.CharField(u'Cidade', max_length=100)
    uf = models.CharField(u'Estado', max_length=2, choices=STATE_CHOICES)
    telefone = models.IntegerField(u'Telefone', max_length=10)
    contato = models.CharField(u'Contato', max_length=30, null=True, blank=True)
    email = models.EmailField(u'Email',)
    doc_empresa = models.FileField(u'Documentos da empresa',
                    upload_to= doc_empresa_upload_location, null=True, blank=True)
    data_doc_empresa = models.DateTimeField(u'Data de modificação da documentação da empresa',
                                null=True,blank=True)

    doc_produtos = models.FileField('Documentos de produtos',
                    upload_to= doc_produtos_upload_location, null=True, blank=True)
    data_doc_produtos = models.DateTimeField(u'Data de modificação da documentação de produtos',
                                null=True, blank=True)
    indice = models.FloatField('Indice', null=True, blank=True)
    estado = models.ForeignKey('Estado',)
    usuario = models.OneToOneField(User,)

    def __unicode__(self):
        return u'%s' % (self.nome_fantasia)

    def get_absolute_url(self):
        return reverse('index') + '?f=%s' % self.id

    def get_filename_doc_empresa(self):
        if self.doc_empresa:
            return self.doc_empresa.file.name.split('/')[-1]
        return ''

    def get_filename_doc_produtos(self):
        if self.doc_produtos:
            return self.doc_produtos.file.name.split('/')[-1]
        return ''

    def get_telefone(self):
        tel = str(self.telefone)

        if len(tel) == 8:
            return "%s-%s" % (tel[0:4], tel[4:8])

        if len(tel) == 10:
            return "(%s) %s-%s" % (tel[0:2], tel[2:6], tel[6:10])

        return self.telefone

    def get_endereco(self):
        return self.logradouro

    def get_indice(self):
        return (u'%.3f' % self.indice).replace('.',',')

    def get_cnpj(self):
        cnpj = str(self.cnpj)
        if len(cnpj) <= 14:
            cnpj = cnpj.zfill(14)
            return "%s.%s.%s/%s-%s" % ( cnpj[0:2], cnpj[2:5], cnpj[5:8], cnpj[8:12], cnpj[12:14] )

        return self.cnpj

    def set_doc_empresa_entregue(self):
        self.data_doc_empresa = datetime.now()
        self.estado = Estado.objects.get(code='doc_prod')
        if self.doc_produtos:
            self.estado = Estado.objects.get(code='ahomolog')
        self.save()

    def set_doc_produtos_entregue(self):
        self.data_doc_produtos = datetime.now()
        if not self.doc_empresa:
            self.estado = Estado.objects.get(code='criado')
        else:
            self.estado = Estado.objects.get(code='ahomolog')
        self.save()

    def can_homologar(self):
        if self.estado.code == 'ahomolog':
            return True
        return False

    def homologar(self, indice):
        if self.can_homologar():
            self.estado = Estado.objects.get(code='homologado')
            self.indice = indice
            self.save()
            return True
        return False

    def cancelar(self):
        self.estado = Estado.objects.get(code='cancelado')
        self.save()

    def is_homologado(self):
        if self.estado.code == 'homologado' and self.indice:
            return True
        return False



class Estado(models.Model):
    class Meta:
        db_table='estado'

    code = models.CharField(
                                u'Codigo',
                                max_length=10,
                                )

    descricao = models.CharField(
                                u'Descrição do estado',
                                max_length=100,
                                )

    proximo_estado = models.ForeignKey(
                                'self',
                                blank=True,
                                null=True,
                                )


    def __unicode__(self):
        return self.descricao
